from pyecharts.charts import Bar , Timeline
from pyecharts.options import*
def my_function():
    #创建3个柱状图表
    bar1 = Bar()
    bar1.add_xaxis(["中国","美国", "日本"])
    bar1.add_yaxis("GDP", [30,20,10], label_opts=LabelOpts(position="right"))
    #反转一下两轴
    bar1.reversal_axis()

    bar2 = Bar()
    bar2.add_xaxis(["中国","美国", "日本"])
    bar2.add_yaxis("GDP", [60,50,40], label_opts=LabelOpts(position="right"))
    bar2.reversal_axis()

    bar3 = Bar()
    bar3.add_xaxis(["中国","美国", "日本"])
    bar3.add_yaxis("GDP", [90,110,50], label_opts=LabelOpts(position="right"))
    bar3.reversal_axis()

    #创建一个时间线对象
    timeline = Timeline()
    #添加3个点
    timeline.add(bar1, "点1")
    timeline.add(bar2, "点2")
    timeline.add(bar3, "点3")


    #设置自动播放
    timeline.add_schema(
        play_interval = 1000,
        is_timeline_show=True,
        is_auto_play=True,
        is_loop_play=True
    )


    #通过时间线来绘图，因为bar对象有3个
    timeline.render("动态柱状图.html")

#------------------------test_function END--------------------------

#------------------------test——sort排序函数--------------------------
def my_function2():
    my_list = [["feng", 33], ["jia", 22], ["rui", 55]]
    #类似于C语言的qsort函数， 其中的key代指排序依据的函数，返回数字，则按数字大小排序，返回字母，则按字母大小排序
    #依照数字大小降序排列
    #使用带名字函数
    def sort_func(element):
        return element[1]
    my_list.sort(key = sort_func, reverse=True)
    print(my_list)

    my_list = [["feng", 33], ["jia", 22], ["rui", 55]]

    #使用lambda函数
    my_list.sort(key = lambda element: element[1], reverse=True)
    print(my_list)
#------------------------test_function END--------------------------

f = open("d:\语法\资料\可视化案例数据\动态柱状图数据\\1960-2019全球GDP数据.csv", "r", encoding="GB2312")

data_lines = f.readlines()#---------readlines()读出来的数据是字符串列表，因为这次的数据是换行的
f.close()
data_lines.pop(0)#------------------pop()函数取出列表指定下标对象

#创建一个字典，让数据按照{1960：[["美国", 123],["中国"，444],......], 1961:[["美国", 123],["中国"，444]]....}
data_dict = {}
#创建一个时间线对象
timeline = Timeline()
for line in data_lines:
    year = int(line.split(",")[0])  #---------年份
    country = line.split(",")[1]    #---------国家
    gdp = float(line.split(",")[2]) #---------gdp

    #当字典事先没有key（年份）时，加入会报错
    #究极难点
    try:
        data_dict[year].append([country, gdp])
    except:
        data_dict[year] = []
        data_dict[year].append([country, gdp])

# print(data_dict)

#排序年份
sorted_year_list = sorted(data_dict.keys())#-------将key（年份）排好序
for year in sorted_year_list:
    data_dict[year].sort(key = lambda element: element[1], reverse = True)#---将数据按年份排好序
    #提取前八名的国家
    year_data = data_dict[year][0:8]
    x_data = []
    y_data = []

    for country_gdp in year_data:
        x_data.append(country_gdp[0])
        y_data.append(country_gdp[1] / 100000000)

    #构建柱状图
    bar = Bar()
    x_data.reverse()
    y_data.reverse()
    bar.add_xaxis(x_data)
    bar.add_yaxis("GDP(亿)", y_data, label_opts= LabelOpts(position="right"))
    #反转xzhou和y轴
    bar.reversal_axis()

    #设置每一年的图表的标题
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}年全球前八的国家GDP总量")
    )
    timeline.add(bar, str(year))


#设自动播放
timeline.add_schema(
    play_interval = 1000,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=True
)

timeline.render("全球GDP历年排序.html")